package com.cskaoyan.javase.method._2exercise;

import java.util.Scanner;

/**
 * 小试牛刀，完成以下练习题：
 * 求两个数的最大值。
 * 键盘录入两个值，求最大值。
 *
 * 定义一个方法用于判断一个正整数的奇偶性，要求：
 * 奇数方法返回false
 * 偶数方法返回true
 * 定义一个计算器（Calculator）它的功能有：
 *
 * 加，减，乘，除
 * 求平方
 * 求a的n次方
 * ...
 * 定义一个方法，求圆的面积：
 *
 * 方法参数:半径 (radius)
 * 圆周率:3.14（获取用Math.PI获取）
 *
 *
 * 方法的实参数据类型和形参数据类型存在自动类型转换,可以兼容.
 * 那么方法的具体返回值和方法的返回值类型,同样具有这种兼容的关系,同样存在自动类型转换
 * 当方法的具体返回值的数据类型,可以自动类型转换到返回值类型,比如int --> long
 * 那么这个具体的返回值就可以作为方法的返回值
 *
 * 扩展:
 * 基本数据类型具有自动类型转换
 * 引用数据类型也是有自动类型转换的
 * 所以如果方法中引用数据类型做形参或者返回值类型
 * 也存在以上结论
 *
 * @since 11:06
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // System.out.println(getMaxValue(1, 4));
        // Scanner sc = new Scanner(System.in);
        // System.out.println(getMaxValueByScanner(sc));

        System.out.println(power(2, 6));
    }

    // 求两个int数的最大值
    public static int getMaxValue(int num1, int num2) {
        return ((num1 > num2) ? num1 : num2);
    }

    // 键盘录入两个值，求最大值,要求方法内部进行键盘录入
    // Scanner一个引用数据类型作为形参数据类型,这时表示需要外界传入一个Scanner对象
    public static int getMaxValueByScanner(Scanner sc) {
        System.out.println("请键盘录入两个int数值:");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        return ((num1 > num2) ? num1 : num2);
    }

    /*
        定义一个方法用于判断一个正整数的奇偶性，要求：
            奇数方法返回false
            偶数方法返回true
     */
    public static boolean judgeNumParity(int num) {
        /*if (num % 2 == 0){
            // 是偶数
            return true;
        }else {
            // 是奇数
            return false;
        }*/
        /*if (num % 2 == 0){
            // 是偶数
            return true;
        }
        // 不是偶数,肯定是奇数
        return false;*/

        // '(num % 2 == 0) ? true : false' can be simplified to 'num % 2 == 0'
        // return ((num % 2 == 0) ? true : false);
        return num % 2 == 0;
    }

    // 求a的n次方,a是一个正整数,n也是一个正整数
    public static long power(int a, int n) {
        /*
         a的n次方是 n个a相乘 可以用循环来完成这个事情
         首先需要明确循环需要进行n次
          */
        long result = 1;
        for (int i = 0; i < n; i++) {
            // 每循环一次,就乘以一个a,这里需要一个变量来进行乘以a的操作,该变量需要定义在循环外部
            result = a * result;
        }
        // 这里返回值类型是long类型,但实际上返回了int类型,为什么可以这样呢?
        return result;
    }

    public static long power2(int a, int n) {
        /*
            幂运算在Java中已经存在现成的实现,使用
            Java中的数学工具类,java.lang.Math
            其中存在一个方法 double pow(double a,double b) 该方法用于计算a的b次方 方法的返回值类型是double
         */
        // 这里做强转,进行取整操作,实际上就是去掉一个".0"
        return (long) Math.pow(a, n);
    }
}
